package com.etalk.crm.service;

import com.etalk.crm.pojo.PaperTrackRecord;
import com.etalk.crm.pojo.Person;
import com.etalk.crm.pojo.TestPaper;
import com.etalk.crm.pojo.TestPaperType;
import com.github.pagehelper.PageInfo;

import java.util.List;
import java.util.Map;

/**
 * @author Terwer
 * @date 2018/06/05
 */
public interface TestPaperService {
    /**
     * 根据搜索条件查询试卷信息
     *
     * @param paramMap 搜索条件
     * @param pageNum  页码
     * @param pageSize 每页展示的数目
     * @return 试卷列表
     */
    PageInfo<TestPaper> getTestPaperList(Map<String, Object> paramMap, Integer pageNum, Integer pageSize);

    /**
     * 根据搜索条件查询发送出去的试卷列表
     *
     * @param paramMap 搜索条件
     * @param pageNum  页码
     * @param pageSize 每页展示的数目
     * @return 试卷列表
     */
    PageInfo<TestPaper> getSendedPaperListList(Map<String, Object> paramMap, Integer pageNum, Integer pageSize);

    /**
     * 根据试卷ID查询试卷信息
     *
     * @param testPaperId 试卷ID
     * @return
     */
    TestPaper getTestPaperByTestPaperId(Integer testPaperId) throws Exception;

    /**
     * 只查询供修改的基本信息
     *
     * @param testPaperId
     * @return 试卷基本信息
     * @throws Exception
     */
    TestPaper getBasicInfoByTestPaperId(Integer testPaperId) throws Exception;

    /**
     * 根据试卷ID和分数ID查询供修改的基本信息
     *
     * @param testPaperId 试卷ID
     * @param scoreId     学生ID
     * @return 试卷基本信息
     */
    TestPaper selectBasicInfoByTestPaperIdAndScoreId(Integer testPaperId, Integer scoreId);

    /**
     * 根据试卷ID和学生ID查询试卷信息
     *
     * @param testPaperId 试卷ID
     * @param scoreId     分数ID
     * @return
     */
    TestPaper selectByTestPaperIdAndScoreId(Integer testPaperId, Integer scoreId);

    /**
     * 查询试卷类型下列数据
     *
     * @return
     */
    List<TestPaperType> selectPaperTypeList();

    /**
     * 生成一份新试卷
     *
     * @param testPaper
     * @return
     */
    boolean saveTestPaper(TestPaper testPaper);

    /**
     * 删除试卷
     *
     * @param testPaperId 试卷ID
     * @return
     */
    boolean deleteTestPaper(Integer testPaperId);

    /**
     * 获取学生列表
     *
     * @return
     */
    PageInfo<Person> getStudentList(String studentName, Integer pageNum, Integer pageSize);

    /**
     * 获取学生以及对应的试卷信息
     *
     * @param personId 学生ID
     * @return 学生试卷列表
     */
    PageInfo<TestPaper> getPaperListByPersonId(Integer personId, Integer pageNum, Integer pageSize);


    /**
     * 检测用户本试卷是否可以测试
     *
     * @return
     */
    boolean checkTestState(Integer paperId, Integer personId);

    /**
     * 发送试卷给学生
     *
     * @param paperId
     * @param personId
     * @return
     */
    Integer sendPaperToStudent(Integer paperId, Integer personId);

    /**
     * 修改试卷状态
     *
     * @param scoreId 分数ID
     * @param state   状态：0未做，1待批改，2未讲解完，3已讲解完
     * @return 是否成功
     */
    boolean changePaperState(Integer scoreId, Integer state);

    /**
     * 查询学生做过的试卷
     *
     * @param personId  学生ID
     * @param stateList 状态字符串
     * @param pageNum   页码
     * @param pageSize  每页展示数目
     * @return
     */
    Map selectByStudentAndPage(Integer personId, String stateList, Integer pageNum, Integer pageSize);

    /**
     * 查询试卷中所有题目ID
     *
     * @param paramMap 筛选条件
     * @return ID列表
     */
    List<Map> getTestPaperQuestionInfo(Map paramMap);

    /**
     * 查询试卷中题目数目
     *
     * @param paramMap 筛选条件
     * @return ID列表及分页信息
     */
    Integer getTestPaperQuestionInfoCount(Map paramMap);

    /**
     * 分页查询试卷中所有题目ID
     *
     * @param paramMap   筛选条件
     * @param pageNumber 页码
     * @param pageSize   每页展示的数目
     * @return ID列表及分页信息
     */
    PageInfo<Map> getTestPaperQuestionInfoByPage(Map paramMap, Integer pageNumber, Integer pageSize);

    /**
     * 检测是否可以自动批改
     *
     * @param scoreId 分数ID
     * @return 状态
     */
    boolean checkIsAuto(Integer scoreId);

    /**
     * 批量插入试卷学生关联信息
     *
     * @param paperId 试卷ID
     * @return 结果
     */
    boolean batchSaveTestPaperScoresByTextbook(Integer paperId) throws Exception;

    /**
     * 更新状态
     *
     * @param scoreId
     * @return
     */
    boolean updatePaperTrackStatus(Integer scoreId, Integer trackStatus);

    /**
     * 修改跟进结果
     *
     * @param paperTrackRecord 跟进记录
     * @return 结果
     */
    boolean updatePaperTrackRecord(PaperTrackRecord paperTrackRecord);

    /**
     * 批量更新题目排序
     *
     * @param paramMap 参数
     * @return 结果
     */
    boolean updatePaperQuestionSort(Map paramMap);

    /**
     * 查询试卷中做过的题目数目
     *
     * @param paperId 试卷ID
     * @return 结果
     */
    boolean checkPaperHasDone(Integer paperId);

    /**
     * 试卷启用禁用
     *
     * @param paperId 试卷ID
     * @return 结果
     */
    boolean changePaperAvailableState(Integer paperId, Integer state);
}
